package com.ht.api.db.task;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.ht.api.db.Db;
import com.ht.api.db.DbConfig;
import com.ht.api.db.Entity;
import com.ht.api.db.StreamLoadConfig;
import com.ht.api.db.util.RedisUtil;

import cn.hutool.json.JSONObject;
import lombok.extern.slf4j.Slf4j;
/**
 * 通用回调：批量插入数据
 * @author asq
 * @createTime 2025年3月10日 11:45:15
 */
@Slf4j
public class TaskGroupToInsertBatchResultCallback implements TaskCallback {

	@SuppressWarnings("unchecked")
	@Override
	public void callback(String groupId, JSONObject param) {
		// 生成缓存的key
		String dataKey = "taskgroup:data:" + groupId;
		String tenantKey = "taskgroup:tenant:" + groupId;
		
		try {
			// 从缓存中获取全部数据
			List<Entity> dbList = new ArrayList<>();
			Map<Object, Object> map = RedisUtil.entries(dataKey);
			map.values().stream().forEach(t -> {
				 List<Entity> list = (List<Entity>)t;
				 dbList.addAll(list);
			});
			
			// 从缓存中获取租户ID
			long tenantId = RedisUtil.get(tenantKey);
	        StreamLoadConfig config = DbConfig.useTenantSLC(tenantId);
			
			// 一次性存入数据库
	        if (!dbList.isEmpty()) {

				Db.insertBatchWithStream(config, dbList);
				log.info("任务组{}完成，执行回调，一次性插入数据库，数据条数：{}", groupId, dbList.size());
	        } else {
	        	log.info("任务组{}完成，执行回调，数据条数为0，不写入数据库", groupId);
	        }
		} catch (Exception e) {
			log.error("任务组{}完成，执行回调时发生异常：{}", groupId, e.getMessage(), e);
		} finally {
			// 清除缓存
			RedisUtil.delete(dataKey, tenantKey);
		}
        
	}

}
